import re
from typing import List

from bs4 import BeautifulSoup, Tag

from axiom_boot.logging.setup import get_logger
from axiom_boot.scraper.interfaces import Extractor, Response, Item, Target
from src.scraper.models.SupplierItem import SupplierItem

logger = get_logger(__name__)


class ContactExtractor(Extractor):
    def extract(self, response: Response, target: Target) -> List[Item]:
        soup = BeautifulSoup(response.text, "html.parser")
        item: SupplierItem = target.metadata.get("item", SupplierItem())

        logger.info(f"开始从联系页面 {response.url} 提取联系信息...")

        # 使用正确的容器选择器
        contact_container = soup.select_one("div.contact-info")
        if not contact_container:
            logger.error(f"在页面 {response.url} 未能找到 .contact-info 的主要联系信息容器。")
            return [item]

        # 使用正确的英文标签
        item.address = self._get_value_by_label(contact_container, "Address:")
        item.telephone = self._get_value_by_label(contact_container, "Telephone:")
        item.mobile_phone = self._get_value_by_label(contact_container, "Mobile Phone:")

        # 从截图中看，没有独立的联系人姓名和职位字段，它们可能需要从其他地方获取或不存在
        # 我们暂时只提取页面上明确存在的字段

        logger.info(f"联系页面 {response.url} 提取完成。")
        return [item]

    def _get_value_by_label(self, scope: Tag, label: str) -> str:
        """
        一个健壮的提取器，能处理 contact-info 布局。
        """
        # 移除末尾的冒号以便进行不精确匹配
        clean_label = label.lower().rstrip(":")
        
        # 核心策略: div.info-label + div.info-fields 布局
        label_divs = scope.find_all("div", class_="info-label")
        for label_div in label_divs:
            if label_div.get_text(strip=True).lower().rstrip(":") == clean_label:
                value_div = label_div.find_next_sibling("div", class_="info-fields")
                if value_div:
                    # 对于地址，我们需要提取 .contact-address span 内部的文本
                    if clean_label == "address":
                        address_span = value_div.select_one(".contact-address")
                        if address_span:
                            return address_span.get_text(strip=True)
                    return value_div.get_text(strip=True)

        logger.warning(f"在当前容器内，未能为标签 '{label}' 找到对应的值。")
        return "" 